package fsmsim.buffer;

import fsmsim.dataStructure.Event;


/**
 * <p>Title: FSMSim</p>
 *
 * <p>Description: Simulatore di macchine a stati finiti.</p>
 *
 * <p>Copyright: Copyright (c) 2008</p>
 *
 * <p>Company: Bollati, Donati, Gabrielli, Peli</p>
 *
 * @author Bollati, Donati, Gabrielli, Peli
 * @version 3.0
 */

public class BufferLIFO extends Buffer {

    
    /**
     * Costruttore
     * @param policyType
     * @param dimension
     */

    public BufferLIFO(int policyType, int dimension) {
        super(policyType,dimension);
    }

    
    /**
     * Aggiunge evento al buffer LIFO
     * @param aEvent
     */

    public void addEvent(Event aEvent) {
        if (isFull()) {
            this.getPolicy().placeEventIntoBuffer(this, aEvent);
        } else {
            int i = this.getBuffer().size() - 1;
            while (this.getBuffer().getElement(i)!= null) {
                i--;
            }
            this.addEvent(aEvent, i);
        }
    }

    
    /**
     * Torna true se il buffer è completamente vuoto
     * @return
     */
    
    public boolean isEmpty() {
        return (this.getBuffer().getElement(this.getBuffer().size() - 1) == null ? true : false);
    }

    
    /**
     * Torna true se il buffer è completamente pieno
     * @return
     */

    public boolean isFull() {
        Event e = (Event)this.getBuffer().getElement(0);
       // return (this.getBuffer().getEventByPosition(0).getName().compareTo(" ") != 0 ? true : false);
          if (e == null)
              return false;
          else return true;
       //  return (this.getBuffer().getEventByPosition(0) != null ? true : false);
    }

    
    /**
     * Preleva un evento dal buffer
     * @return
     */

    public Event drawEvent() {
        // se non trova niente nel buffer ritorna null
        Event data = null;

        // primo dato da spostare
        int i = 0;
        // cerco prima posizione con dato buono da prelevare
        while ((i != this.getBuffer().size() - 1) && (this.getBuffer().getElement(i) == null)) {
            i++;
        }
        // drawEvent il dato e libera la posizione del dato (LIFO)
        data = (Event)this.getBuffer().getElement(i);
        this.addEvent(null, i);
        // ritorna il dato da prelevare (se ce n'erano)
        return data;
    }

    
    /**
     * Ritorna una copia del prossimo evento da prelevare dal buffer (senza
     * prelevarlo)
     * @return
     */
    
    public Event getEvent() {
        // se non trova niente nel buffr ritorna null
        Event data = null;

        // primo dato da spostare
        int i = 0;
        // cerco prima posizione con dato buono da prelevare
        while ((i != this.getBuffer().size() - 1) && (this.getBuffer().getElement(i) == null)) {
            i++;
        }
        // drawEvent il dato e libera la posizione del dato (LIFO)
        data = (Event)this.getBuffer().getElement(i);

        // ritorna il dato da prelevare (se ce n'erano)
        return data;
    }

}
